/*
	高并发TCP服务器
		1. 建立侦听器
		2. 循环获取新连接
		3. 启动goroutine与新连接通信
*/
package main

import (
	"fmt"
	"log"
	"net"
	"os"
)

func main() {
	//建立回射服务器
	//1. 建立侦听器 将socket变为被动态
	lsr, err := net.Listen("tcp", ":8888")
	if err != nil {
		log.Panic("failed to Listen ", err) //调用panic异常，导致进程异常终止
	}
	defer lsr.Close()
	//2. 利用侦听器获取新连接（客户端请求连接时，服务器不用处理，操作系统负责将三次握手完成，将客户端连接信息存放在已连接列表中）

	for {
		conn, err := lsr.Accept() //阻塞获取新连接
		if err != nil {
			//即使出现问题，也不要关闭服务器
			fmt.Println("failed to Accept", err)
			continue
		}
		//启动goroutine通信
		go conn_handle(conn)
	}

}

func conn_handle(conn net.Conn) {
	defer conn.Close()
	fmt.Println("new conn :", conn.RemoteAddr())
	//3. 通过新客户端连接与之通信
	buf := make([]byte, 256)
	for {
		//Read并不会每次清空buf，只会在原来的基础上覆盖
		n, err := conn.Read(buf) //将内核的缓冲区内容拷贝至buf //阻塞读
		if err != nil {
			fmt.Println("failed to read ", err)
			break
		}
		os.Stdout.Write(buf[:n]) //写到屏幕
		conn.Write(buf[:n])      //写到网络中
	}
}
